package com.estore.view;

import com.estore.model.Product;
import com.estore.service.ProductService;
import com.estore.sorter.ProductSorters;

import java.util.*;

public class ConsoleShop {

    private final ProductService productService = new ProductService();
    // 购物车：key是商品ID，value是购买数量
    private final Map<String, Integer> shoppingCart = new HashMap<>();
    private final Scanner scanner = new Scanner(System.in);

    public void start() {
        System.out.println("=== 天天商城系统启动 ===");

        while (true) {
            showMenu();

            // 处理输入，避免非数字输入导致异常
            if (!scanner.hasNextInt()) {
                System.out.println("请输入有效的数字选项！");
                scanner.nextLine(); // 清除无效输入
                continue;
            }

            int choice = scanner.nextInt();
            scanner.nextLine(); // 消费掉换行符

            switch (choice) {
                case 1:
                    browseProducts();
                    break;
                case 2:
                    showSortedProducts();
                    break;
                case 3:
                    addToCart();
                    break;
                case 4:
                    viewCart();
                    break;
                case 5:
                    // 退出前保存数据
                    productService.saveData();
                    System.out.println("感谢使用天天商城，再见！");
                    return;
                case 99: // 隐藏的管理员选项 - 备份数据
                    backupData();
                    break;
                default:
                    System.out.println("无效的选项，请重新输入！");
            }
        }
    }

    private void showMenu() {
        System.out.println("\n========== 欢迎来到天天商城 ==========");
        System.out.println("1. 浏览所有商品（默认排序）");
        System.out.println("2. 自定义排序浏览商品");
        System.out.println("3. 添加到购物车");
        System.out.println("4. 查看购物车");
        System.out.println("5. 退出");
        System.out.print("请输入您的选择: ");
    }

    private void showSortedProducts() {
        System.out.println("\n--- 请选择排序方式 ---");
        System.out.println("1. 按价格从低到高");
        System.out.println("2. 按价格从高到低");
        System.out.println("3. 按库存从多到少");
        System.out.println("4. 按商品ID排序（默认）");
        System.out.print("请输入您的选择: ");

        // 处理输入，避免非数字输入导致异常
        if (!scanner.hasNextInt()) {
            System.out.println("请输入有效的数字选项！");
            scanner.nextLine(); // 清除无效输入
            return;
        }

        int sortChoice = scanner.nextInt();
        scanner.nextLine(); // 消费换行符

        Comparator<Product> comparator = null;
        String sortDescription = "";

        switch (sortChoice) {
            case 1:
                comparator = ProductSorters.BY_PRICE_ASC;
                sortDescription = "（按价格从低到高）";
                break;
            case 2:
                comparator = ProductSorters.BY_PRICE_DESC;
                sortDescription = "（按价格从高到低）";
                break;
            case 3:
                comparator = ProductSorters.BY_STOCK_DESC;
                sortDescription = "（按库存从多到少）";
                break;
            case 4:
                // 使用自然排序（按ID）
                sortDescription = "（按商品ID）";
                break;
            default:
                System.out.println("无效的排序选择，请使用默认排序！");
        }

        browseProducts(comparator, sortDescription);
    }

    private void browseProducts() {
        browseProducts(null, "（默认排序）");
    }

    private void browseProducts(Comparator<Product> comparator, String sortDescription) {
        System.out.println("\n--- 商品列表 " + sortDescription + " ---");
        List<Product> products = productService.getAllProducts();

        if (products.isEmpty()) {
            System.out.println("商店里还没有商品！");
        } else {
            // 根据是否传入比较器决定排序方式
            if (comparator != null) {
                products.sort(comparator);
            } else {
                Collections.sort(products); // 使用自然排序（Comparable）
            }

            // 显示商品总数
            System.out.println("共找到 " + products.size() + " 个商品：");
            products.forEach(System.out::println);
        }
    }

    private void addToCart() {
        System.out.print("请输入要添加的商品ID: ");
        String productId = scanner.nextLine().trim();
        Product product = productService.findProductById(productId);

        if (product == null) {
            System.out.println("ERROR：找不到该商品！");
            return;
        }
        if (product.getStock() <= 0) {
            System.out.println("此商品已售罄。");
            return;
        }

        System.out.print("请输入购买数量: ");

        // 处理输入，避免非数字输入导致异常
        if (!scanner.hasNextInt()) {
            System.out.println("ERROR：请输入有效的数字！");
            scanner.nextLine(); // 清除无效输入
            return;
        }

        int quantity = scanner.nextInt();
        scanner.nextLine(); // 消费换行符

        if (quantity <= 0) {
            System.out.println("ERROR：购买数量必须为正数！");
            return;
        }
        if (quantity > product.getStock()) {
            System.out.println("ERROR：库存不足！当前库存为 " + product.getStock());
            return;
        }

        // 将商品加入购物车，如果已存在则累加数量
        int currentQuantity = shoppingCart.getOrDefault(productId, 0);
        shoppingCart.put(productId, currentQuantity + quantity);
        System.out.println("成功将 '" + product.getName() + "' ×" + quantity + " 添加到购物车！");
    }

    private void viewCart() {
        System.out.println("\n--- 我的购物车 ---");
        if (shoppingCart.isEmpty()) {
            System.out.println("购物车是空的，快去逛逛吧！");
            return;
        }

        double total = 0.0;
        int itemCount = 0;

        System.out.println("序号 | 商品名称               | 单价       | 数量 | 小计");
        System.out.println("----------------------------------------------------------");

        int index = 1;
        for (Map.Entry<String, Integer> entry : shoppingCart.entrySet()) {
            String productId = entry.getKey();
            Integer quantity = entry.getValue();
            Product product = productService.findProductById(productId);
            if (product != null) {
                double subtotal = product.getPrice() * quantity;
                System.out.printf("%-4d | %-20s | ¥%-8.2f | %-4d | ¥%.2f\n",
                        index++, product.getName(), product.getPrice(), quantity, subtotal);
                total += subtotal;
                itemCount += quantity;
            }
        }
        System.out.println("----------------------------------------------------------");
        System.out.printf("总计: %d 件商品，合计金额: ¥%.2f\n", itemCount, total);
    }

    /**
     * 备份数据文件（管理员功能）
     */
    private void backupData() {
        System.out.println("\n=== 数据备份功能 ===");
        System.out.println("开始备份数据文件...");
        try {
            productService.backupData();
            System.out.println("数据备份完成！");
        } catch (Exception e) {
            System.out.println("备份失败: " + e.getMessage());
        }
    }

    public static void main(String[] args) {
        ConsoleShop shop = new ConsoleShop();

        // 添加关闭钩子，确保程序异常退出时也能保存数据
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("\n程序关闭，保存数据...");
            // 注意：在静态上下文中无法直接访问非静态的productService
            // 在实际项目中可以考虑使用单例模式或其他方式解决
        }));

        try {
            shop.start();
        } catch (Exception e) {
            System.err.println("系统发生错误: " + e.getMessage());
            e.printStackTrace();
        }
    }
}